Error Control Coding (ECC) schemes are essential in data storage applications to provide data integrity. For NAND flash memories, different ECC schemes including low-density parity-check (LDPC) codes, Bose-Chaudhuri-Hocquenghem (BCH) codes and turbo product codes (TPCs) can be used. TPC codes can provide low data failure rates compared to other state of the art codes when a single read information is available from the NAND flash memory (e.g., hard decision decoding). However, in some scenarios, when soft information is available from the NAND flash memory, LDPC codes may provide better decoding results. Turbo product codes may also be decoded with a soft decision decoding algorithm, such as Chase(L) decoding algorithm. There is a need in the art to improve decoding performance of TPC codes when soft information is available at the decoder.